
/**
 * @author xizizzz
 * @description: TODO
 * @date 2021-8-31下午 01:15
 */
public class Test {
    public static void main(String[] args) {

        // 在编译的时候，在常量池中生成"abc"，运行时在堆中生成"abc"。
        String str1 = new String("abc");
        // 该方法首先查找常量池中是否存在"abc"，如果存在返回该常量的引用，
        // 如果不存在，将堆中的"abc"的引用加入常量池(jdk1.7之后)，并返回，
        // 注意jdk1.7之前是将堆中的"abc"拷贝到常量池并返回常量池中的引用。
        str1.intern();
        // 会在堆中创建Stringbuilder,然后调用append方法将str1和str2存起来。
//        String str3 = str1+str2;


        String aa = "AA";//设置常量AA到常量池
        String bb = "BB";//设置常量BB到常量池
        String ccdd = "CC" + "DD";//设置常量CCDD到常量池
        String neeff = new String("EE") + new String("FF");//设置EE和FF到常量池。并且添加EE、FF和EEFF对象到堆
        String aabb = aa + bb;//添加AABB对象到堆
        String gghh = "GG" + new String("HH");//设置GG和HH常量到常量池,设置HH和GGHH对象到堆
//         aa.intern();//啥事都不做，返回AA常量
//         ccdd.intern();//啥事都不做，返回CCDD常量
//         neeff.intern();//添加EEFF对象的引用到常量池，并返回EEFF对象
//         aabb.intern();//添加AABB对象的引用到常量池，并返回AABB对象
//         gghh.intern();//添加GGHH对象的引用到常量池，并返回GGHH对象
        System.out.println(aa.intern() == aa); //true
        System.out.println(neeff.intern() == "EEFF");//true
        System.out.println("EEFF" == neeff);//true
        String nccdd = new String("CCDD");
        System.out.println(ccdd == nccdd);//false
        System.out.println(ccdd == nccdd.intern());//true
        System.out.println(aabb.intern() == aabb);//true
        System.out.println(gghh == gghh.intern());//true
    }
}
